﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using MoviTiendas.Logica;
using MoviTiendas.Comunicacion;
using MoviTiendas.Sensores;

namespace MoviTiendas.Interfaz
{
    public partial class PaginaTiendas : PhoneApplicationPage, SolicitanteComunicacion
    {
        // ------------------------------------------------------------------------------------
        // Atributos
        // ------------------------------------------------------------------------------------

        /**
         * Lista de celdas, las cuales contienen tiendas
         */
        public List<CeldaDetail> celdas { get; set; }

        /**
         * Lista de barrios que se seleccionaron en la vista anterior
         */
        public List<Barrio> barrios { get; set; }

        /**
         * Lista de tiendas seleccionadas 
         */
        public List<Tienda> tiendasSeleccionadas { get; set; }


        // ------------------------------------------------------------------------------------
        // Constructor
        // ------------------------------------------------------------------------------------

        /**
         * Constructor de la clase
         */
        public PaginaTiendas()
        {
            InitializeComponent();
            tiendasSeleccionadas = new List<Tienda>();
            barrios = ParametroPaginas.darParametroConIndice(0) as List<Barrio>;
            Comunicacion.Comunicacion comu = new Comunicacion.Comunicacion(this);
            comu.CargarTiendasDeBarrios(barrios);


        }


        // ------------------------------------------------------------------------------------
        // Métodos generales
        // ------------------------------------------------------------------------------------

        /**
         * Método que se ejecuta cuando se selecciona una celda
         * @celda - Celda seleccionada por medio de la interfaz gráfica
         */
        public void seleccionarCelda(CeldaDetail celda)
        {
            Tienda t = celda.objeto as Tienda;

            //Si la tienda no está en el arreglo, se agrega
            if (!tiendasSeleccionadas.Contains(celda.objeto as Tienda))
            {
                tiendasSeleccionadas.Add(t);
              //  celda.seleccionarCelda();
                Tienda t2 = null;
                foreach (CeldaDetail cel in celdas)
                {
                    t2 = cel.objeto as Tienda;
                    if (t2 != null && t.Equals(t2))
                    {
                        cel.seleccionarCelda();
                    }

                }
            }

            //Si el barrio está en el arreglo, se elimina
            else
            {
                tiendasSeleccionadas.Remove(t);
                Tienda t2 = null;
                foreach (CeldaDetail cel in celdas)
                {
                    t2 = cel.objeto as Tienda;

                    if (t2 != null && t.Equals(t2))
                    {
                        cel.deseleccionarCelda();
                    }

                }
            }

            if (tiendasSeleccionadas.Count() > 0)
            {
                btnBuscarEnTiendas.IsEnabled = true;
            }

            else
            {
                btnBuscarEnTiendas.IsEnabled = false;
            }
        }

        /**
         * Método que se ejecuta cuando se selecciona el botón detail de una celda
         * @celda - Celda seleccionada por medio de la interfaz gráfica
         */
        public void verInfoTienda(CeldaDetail celda)
        {
            Tienda tienda = celda.objeto as Tienda;
            ParametroPaginas.reiniciarParametros("PaginaInfoTienda");
            ParametroPaginas.agregarParametro(tienda);
            NavigationService.Navigate(new Uri("/Interfaz/PaginaInfoTienda.xaml", UriKind.RelativeOrAbsolute));
        }


        /**
         * Este método es llamado por la clase Comunicacion, una vez termine la carga del mundo.
         * Acá se debe cargar la interfaz con garantia de que el mundo ya tiene la información solicitada.
         */
        public void notificarCargaDeDatos()
        {
            listTiendas.Items.Clear();
            //Inicializa el atributo celdas
            celdas = new List<CeldaDetail>();

            //Pinta las celdas del barrio 'Favoritas'
            if (barrios.Contains(MoviTienda.darInstancia.cliente.tiendasFavoritas))
            {
                celdas.Add(new CeldaDetail(this, MoviTienda.darInstancia.cliente.tiendasFavoritas.nombre));
                int i = barrios.IndexOf(MoviTienda.darInstancia.cliente.tiendasFavoritas);
                foreach (Tienda tienda in barrios[i].tiendas)
                    celdas.Add(new CeldaDetail(this, tienda));
            }

            //Pinta las celdas del barrio del cliente
            if (barrios.Contains(MoviTienda.darInstancia.cliente.barrio))
            {
                celdas.Add(new CeldaDetail(this, MoviTienda.darInstancia.cliente.barrio.nombre));
                int i = barrios.IndexOf(MoviTienda.darInstancia.cliente.barrio);
                foreach (Tienda tienda in barrios[i].tiendas)
                {
                    if (barrios.Contains(MoviTienda.darInstancia.cliente.tiendasFavoritas))
                    {
                        if (!MoviTienda.darInstancia.cliente.tiendasFavoritas.tiendas.Contains(tienda))
                            celdas.Add(new CeldaDetail(this, tienda));
                    }
                    else
                    {
                        celdas.Add(new CeldaDetail(this, tienda));
                    }

                }
            }

            //Pinta el resto de las celdas de barrios
            foreach (Barrio barrio in barrios)
            {
                if (!barrio.Equals(MoviTienda.darInstancia.cliente.tiendasFavoritas) && !barrio.Equals(MoviTienda.darInstancia.cliente.barrio))
                {
                    celdas.Add(new CeldaDetail(this, barrio.nombre));
                    foreach (Tienda tienda in barrio.tiendas)
                    {
                        if(!MoviTienda.darInstancia.cliente.tiendasFavoritas.tiendas.Contains(tienda))
                            celdas.Add(new CeldaDetail(this, tienda));
                    }
                }
            }


            //Agrega la celda a la listBarrio para que se pinte
            foreach (CeldaDetail celda in celdas)
            {
                if (tiendasSeleccionadas.Contains(celda.objeto as Tienda))
                    celda.seleccionarCelda();

                listTiendas.Items.Add(celda);
            }

            if (tiendasSeleccionadas.Count() > 0)
            {
                btnBuscarEnTiendas.IsEnabled = true;
            }

            else
            {
                btnBuscarEnTiendas.IsEnabled = false;
            }

        }

        public void recibirResultadosBusquedaPalabraClave(List<Producto> resultados)
        {
        }
        // ------------------------------------------------------------------------------------
        // Métodos manejadores de eventos
        // ------------------------------------------------------------------------------------

        /**
         * Maneja el evento en el que se navega a la página
         * @e - Evento
         */
        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            notificarCargaDeDatos();
        }

        /**
         * Maneja el evento en el que se oprime el botón btnBuscarEnTiendas
         * @sender - Objeto que envía el evento
         * @e - Evento
         */
        private void btnBuscarEnTiendas_Click(object sender, RoutedEventArgs e)
        {
            ParametroPaginas.reiniciarParametros("PaginaCategorias");
            ParametroPaginas.agregarParametro(tiendasSeleccionadas);
            NavigationService.Navigate(new Uri("/Interfaz/PaginaCategorias.xaml", UriKind.RelativeOrAbsolute));
        }
    }
}